﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.IO;
using System.IO.Ports;
using System.Threading;
using System.Windows.Forms;
using System.Timers;
using GPSMap.Core.Misc;
using GPSMap.Core.Misc.DAL;
using HTMapLib;
using HTMapLib.Classes;
using MapControl;
using MapControl.Misc;
using MapControl.Misc.DAL;
using MapControl.Misc.GPSPoint;
using MapXLib;
using Point = System.Drawing.Point;

namespace GPSMap
{
    public partial class frmGPSTracking : Form
    {
        private frmGPSInfo frmInfo;

        //private ImageList imgList = new ImageList();

        //private ComPort GeneralClass.objPort;
        public ucVectShapeMap mapControl;
        private ucToolStrip _ucToolStripControl;

        private Coordinate9x9 _coord9x9;
        private Coordinate5x5 _coord5x5;

        private ucGPSData gpsDataControl;

        public bool isShowGPSData = true;
        public bool isShowRoute = true;

        public List<Airport> AirportList;
        private ucReviewGPSData reviewGpsDataControl;

        private AirPortRepository _airPortRespository;

        private bool isShowTinh, isShowHuyen, isShowXa;

        public frmGPSTracking()
        {
            InitializeComponent();

            try
            {
                _airPortRespository = new AirPortRepository(GeneralClass.appDBFile);

                //Khởi tạo COM port
                GeneralClass.objPort = new ComPort(Properties.Settings.Default.PortName,
                                                   Properties.Settings.Default.BaudRate,
                                                   Properties.Settings.Default.StopBits,
                                                   Properties.Settings.Default.DataBits,
                                                   Properties.Settings.Default.Parity, true);
                GeneralClass.objPort.comPort_DataReceivedEvent +=
                    new SerialDataReceivedEventHandler(comPort_DataReceived);


                //Load Map user control           
                mapControl = new ucVectShapeMap(true);
                mapControl.Dock = DockStyle.Fill;

                //Load Map user control           
                mapControl.ucMap1.AxMap_MouseDownEvent +=
                    new AxMapXLib.CMapXEvents_MouseDownEventHandler(AxMap_MouseDownEvent);
                mapControl.ucMap1.AxMap_MouseMoveEvent +=
                    new AxMapXLib.CMapXEvents_MouseMoveEventHandler(AxMap_MouseMoveEvent);
                mapControl.ucMap1.AxMap_MouseUpEvent += new AxMapXLib.CMapXEvents_MouseUpEventHandler(AxMap_MouseUpEvent);
                mapControl.ucMap1.AxMap_DrawUserLayer +=
                    new AxMapXLib.CMapXEvents_DrawUserLayerEventHandler(AxMap_DrawUserLayer);
                mapControl.ucMap1.AxMap_MouseWheelEvent +=
                    new AxMapXLib.CMapXEvents_MouseWheelEventHandler(AxMap_MouseWheelEvent);
                mapControl.ucMap1.AxMap_MapViewChanged += new System.EventHandler(AxMap_MapViewChangedEvent);
                mapControl.ucMap1.AxMap_DblClick += new System.EventHandler(this.AxMap_DblClick);



                //Load ToolStrip user control
                _ucToolStripControl = new ucToolStrip(mapControl.ucMap1);
                _ucToolStripControl.Dock = DockStyle.Top;

                _coord9x9 = new Coordinate9x9();
                string value = Properties.Settings.Default.Coord9x9;
                _coord9x9.BigSquareArray = value.Split(new char[] {'|'});

                this.Controls.Add(_ucToolStripControl);
                this.Controls.Add(menuStrip1);
                panelMap.Controls.Add(mapControl);

                isShowTinh = isShowHuyen = isShowXa = false;

                GeneralClass.LoadPlaneList();
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("{0} - {1}", ex.Message, ex.StackTrace));
            }
        }

        private void frmGPSTracking_Load(object sender, EventArgs e)
        {
            try
            {
                //Add thêm toolstrip vẽ đường bay
                AddToolStrip();

                mapControl.ucMap1.InitMap(string.Format(@"{0}\Maps\BanDo.gst", Application.StartupPath), 2187000, 106.9284196519465, 16.07934787370213);
                mapControl.ucMap1.Map.NumericCoordSys = mapControl.ucMap1.Map.Layers._Item("ASIAMAP").CoordSys;
                mapControl.ucMap1.Map.DisplayCoordSys = mapControl.ucMap1.Map.Layers._Item("ASIAMAP").CoordSys;
                mapControl.ucMap1.Map.BackColor = Color.Gray;

                frmInfo = new frmGPSInfo(this);
                frmInfo.TopMost = true;

                mapControl.ucMap1.Zoom_Original = 2200000;
                mapControl.ucMap1.CenterX_Original = (mapControl.ucMap1.Map.Layers["AsiaMap"].ClippedBounds.XMin + mapControl.ucMap1.Map.Layers["AsiaMap"].ClippedBounds.XMax)/2;
                mapControl.ucMap1.CenterY_Original = (mapControl.ucMap1.Map.Layers["AsiaMap"].ClippedBounds.YMin + mapControl.ucMap1.Map.Layers["AsiaMap"].ClippedBounds.YMax) / 2;
                mapControl.ucMap1.Map.ZoomTo(mapControl.ucMap1.Zoom_Original, mapControl.ucMap1.CenterX_Original, mapControl.ucMap1.CenterY_Original);

                mapControl.ucMap1.Map.Layers["AsiaMap"].Visible = false;
                bảnĐồ2ToolStripMenuItem_Click(null, null);
                hiểnThịTọaĐộBayToolStripMenuItem_Click(null, null);

                isShowRoute = false;
                //hiểnThịQuỹĐạoBayToolStripMenuItem_Click(null, null);
                //hiểnThịThôngTinQuỹĐạoToolStripMenuItem_Click(null, null);
                //bảngTheoDõiToolStripMenuItem_Click(null, null);
                hiểnThịQuỹĐạoBayToolStripMenuItem.PerformClick();
                hiểnThịThôngTinQuỹĐạoToolStripMenuItem.PerformClick();
                bảngTheoDõiToolStripMenuItem.PerformClick();
                hiểnThịĐườngBayToolStripMenuItem.PerformClick();

                AirportList = _airPortRespository.GetAllList();
            }
            catch (Exception ex)
            {
                MessageBox.Show(String.Format("{0} {1}", ex.Message, ex.StackTrace));
            }
            
        }

        #region Add ToolStrip
        public void AddToolStrip()
        {
            System.Windows.Forms.ToolStripButton toolStripButtonRouteTool = new System.Windows.Forms.ToolStripButton();
            toolStripButtonRouteTool.Name = "toolStripButtonRouteTool";
            toolStripButtonRouteTool.Text = "Vẽ đường bay";
            toolStripButtonRouteTool.Click += new System.EventHandler(this.toolStripButtonRouteTool_Click);
            _ucToolStripControl.AddToolStrip(toolStripButtonRouteTool, 33);
            _ucToolStripControl.ToolStripControl.Items["toolStripButtonRouteTool"].Enabled = false;
        }

        private void toolStripButtonRouteTool_Click(object sender, EventArgs e)
        {
            mapControl.Option = enumOption.NEWPOLY;
            mapControl.ucMap1.Map.CurrentTool = MapXLib.ToolConstants.miArrowTool;
            mapControl.ucMap1.ActiveToolStrip = enumToolStripType.VectorShapeToolStrip;
            _ucToolStripControl.ActiveTool = enumActionToolStrip.None;
        }
        #endregion

        #region COM Port

        /// <summary>
        /// Cập nhật thông tin mở đóng cổng COM
        /// </summary>
        /// <param name="message"></param>
        public void UpdateToolStrip(string message)
        {
            toolStripStatusLabelCOMStatus.Text = message;
        }

        /// <summary>
        /// Hiển thị dữ liệu lên bản đồ
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                if (GeneralClass.dbTestGPS.Rows.Count > 0)
                {
                    //GeneralClass.currGPSData = new GPSCurrentPoint(GeneralClass.dbTestGPS.Rows[GeneralClass.dbTestGPS.Rows.Count - 1]);
                    mapControl.Refresh();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("{0} - {1}", ex.Message, ex.StackTrace));
            }

        }

        #endregion

        #region AxMap

        //Biến dùng để lưu các tọa độ gps đã được vẽ trên bản đồ
        private List<BaseGPSPoint> _objGPSPointList = new List<BaseGPSPoint>();
        //Bảng màu dùng cho tối đa 10 máy bay khác nhau
        private List<Color> colorPathArr = new List<Color>(new Color[] { Color.Yellow, Color.SpringGreen, Color.HotPink, Color.Green, Color.BlueViolet, Color.Aqua });
        private List<Color> colorNodeArr = new List<Color>(new Color[] { Color.SpringGreen, Color.Yellow, Color.Green, Color.HotPink, Color.Aqua, Color.BlueViolet });
        private List<Color> colorCurrNodeArr = new List<Color>(new Color[] { Color.Red, Color.Orange, Color.Blue, Color.Aqua, Color.HotPink, Color.Yellow });

        //Dữ liệu màu của các máy bay hiện tại
        private Dictionary<string, Color> colorGPSPointPathArr = new Dictionary<string, Color>();
        private Dictionary<string, Color> colorGPSPointNodeArr = new Dictionary<string, Color>();
        public void AxMap_DrawUserLayer(object sender, AxMapXLib.CMapXEvents_DrawUserLayerEvent e)
        {

            //IntPtr hdc = new IntPtr(e.hOutputDC);
            Graphics g = Graphics.FromHdc(new IntPtr(e.hOutputDC));
            //Graphics g = mapControl.ucMap1.Map.CreateGraphics();
            g.SmoothingMode = SmoothingMode.AntiAlias;
            try
            {
                //Vẽ đường bay
                mapControl.redraw(g, true);

                //Nếu độ cao < 10.000 km thì vẽ các tọa độ
                if (mapControl.ucMap1.Altitude < 10000)
                {
                    if (GeneralClass.dbTestGPS != null)
                    {
                        _objGPSPointList = new List<BaseGPSPoint>();
                        //Nếu chọn hiển thị tọa độ và hiển thị lộ trình
                        if (isShowGPSData || isShowRoute)
                        {
                            int colorIndex = 0;
                            colorGPSPointPathArr = new Dictionary<string, Color>();
                            colorGPSPointNodeArr = new Dictionary<string, Color>();
                            if (GeneralClass.dbTestGPS.Rows.Count > 0)
                            {
                                //Điểm GPS vẽ gần nhất
                                BaseGPSPoint lastGPSPoint = new GPSNormalPoint(GeneralClass.dbTestGPS.Rows[0]);
                                
                                //Khởi tạo danh sách điểm tọa độ được vẽ gần nhất của các tốp bay
                                Dictionary<string, BaseGPSPoint> lastGPSPointArr = new Dictionary<string, BaseGPSPoint>();
                                lastGPSPointArr.Add(lastGPSPoint.objGPSData.Name, lastGPSPoint);
                                colorGPSPointPathArr.Add(lastGPSPoint.objGPSData.Name, colorPathArr[colorIndex]);
                                colorGPSPointNodeArr.Add(lastGPSPoint.objGPSData.Name, colorNodeArr[colorIndex]);
                                colorIndex++;
                                foreach (DataRow dr in GeneralClass.dbTestGPS.Rows)
                                {
                                    BaseGPSPoint gpsPoint = new GPSNormalPoint(dr);
                                    //Kiểm tra tên máy bay của gpsPoint này đã có chưa
                                    if (!lastGPSPointArr.ContainsKey(gpsPoint.objGPSData.Name))
                                    {
                                        lastGPSPointArr.Add(gpsPoint.objGPSData.Name, gpsPoint);
                                        colorGPSPointPathArr.Add(gpsPoint.objGPSData.Name, colorPathArr[colorIndex]);
                                        colorGPSPointNodeArr.Add(gpsPoint.objGPSData.Name, colorNodeArr[colorIndex]);
                                        colorIndex++;
                                        if (colorIndex == colorPathArr.Count)
                                            colorIndex = 0;
                                        continue;
                                    }

                                    //Nếu vẽ lộ trình
                                    if (isShowRoute)
                                    {
                                        //Nếu distance giữa 2 điểm kế nhau nhỏ hơn 50 km thì mới vẽ lộ trình
                                        if (MapHelper.CalculateDistance(mapControl.ucMap1.Map,
                                                                        gpsPoint.objGPSData.LonGPS,
                                                                        gpsPoint.objGPSData.LatGPS,
                                                                        lastGPSPointArr[gpsPoint.objGPSData.Name].objGPSData.LonGPS,
                                                                        lastGPSPointArr[gpsPoint.objGPSData.Name].objGPSData.LatGPS) < int.Parse(Properties.Settings.Default.MinDistance))
                                        {
                                            //Tính lại tọa độ tâm center của pointFrom
                                            float centerX, centerY;
                                            centerX = centerY = 0;
                                            mapControl.ucMap1.Map.ConvertCoord(ref centerX, ref centerY,
                                                                               ref gpsPoint.objGPSData.LonGPS,
                                                                               ref gpsPoint.objGPSData.LatGPS,
                                                                               MapXLib.ConversionConstants.miMapToScreen);
                                            gpsPoint.CenterPoint = new PointF(centerX, centerY);

                                            //Tính lại tọa độ tâm center của pointTo
                                            centerX = centerY = 0;
                                            mapControl.ucMap1.Map.ConvertCoord(ref centerX, ref centerY,
                                                                               ref lastGPSPointArr[gpsPoint.objGPSData.Name].objGPSData.LonGPS,
                                                                               ref lastGPSPointArr[gpsPoint.objGPSData.Name].objGPSData.LatGPS,
                                                                               MapXLib.ConversionConstants.miMapToScreen);
                                            lastGPSPointArr[gpsPoint.objGPSData.Name].CenterPoint = new PointF(centerX, centerY);

                                            gpsPoint.DrawRoute(g, colorGPSPointPathArr[gpsPoint.objGPSData.Name], lastGPSPointArr[gpsPoint.objGPSData.Name]);
                                        }

                                        //Lưu lại tọa độ gần nhất
                                        lastGPSPointArr[gpsPoint.objGPSData.Name] = gpsPoint;
                                    }

                                    //Nếu vẽ tọa độ
                                    if (isShowGPSData)
                                    {
                                        //Bỏ qua nếu là tọa độ hiện hành (tọa độ đang chọn hoặc tọa độ mới nhất)
                                        if (!gpsPoint.Equals(GeneralClass.currGPSDataArr[gpsPoint.objGPSData.Name]))
                                        {
                                            //Tính lại tọa độ tâm center để vẽ object
                                            float centerX, centerY;
                                            centerX = centerY = 0;
                                            mapControl.ucMap1.Map.ConvertCoord(ref centerX, ref centerY,
                                                                               ref gpsPoint.objGPSData.LonGPS,
                                                                               ref gpsPoint.objGPSData.LatGPS,
                                                                               MapXLib.ConversionConstants.miMapToScreen);
                                            gpsPoint.CenterPoint = new PointF(centerX, centerY);
                                            gpsPoint.Draw(g, colorGPSPointNodeArr[gpsPoint.objGPSData.Name]);

                                            _objGPSPointList.Add(gpsPoint);
                                        }
                                    }

                                }
                            }
                        }

                        int colorIndex2 = 0;
                        foreach (KeyValuePair<string, GPSCurrentPoint> keyValue in GeneralClass.currGPSDataArr)
                        {
                            GPSCurrentPoint currGPSData = keyValue.Value;

                            //Nếu đang mở cổng COM hoặc đang replay thì mới focus theo tọa độ mới nhất
                            if ((GeneralClass.IsViewLatestGPSPoint && GeneralClass.IsReplay == 1) ||
                                GeneralClass.IsViewLatestGPSPoint && GeneralClass.objPort.IsOpen())
                            {
                                mapControl.ucMap1.Map.ZoomTo(mapControl.ucMap1.Map.Zoom,
                                                             currGPSData.objGPSData.LonGPS,
                                                             currGPSData.objGPSData.LatGPS);
                            }

                            //Tính lại tọa độ tâm center để vẽ object
                            float centerX, centerY;
                            centerX = centerY = 0;
                            mapControl.ucMap1.Map.ConvertCoord(ref centerX, ref centerY,
                                                               ref currGPSData.objGPSData.LonGPS,
                                                               ref currGPSData.objGPSData.LatGPS,
                                                               ConversionConstants.miMapToScreen);
                            currGPSData.CenterPoint = new PointF(centerX, centerY);
                            currGPSData.Draw(g, colorCurrNodeArr[colorIndex2]);
                            colorIndex2++;
                            if (colorIndex2 == colorCurrNodeArr.Count)
                                colorIndex2 = 0;

                            //Lưu vào list
                            _objGPSPointList.Add(currGPSData);
                        }
                    }

                    //Nếu là hiển thị vị trí Sân bay đang chọn
                    if (GeneralClass.IsViewAirport)
                    {
                        BaseGPSPoint objAirport = new GPSAirportPoint(GeneralClass.objCurrAirport.Airport_Name,
                                                                      GeneralClass.objCurrAirport.Longitude,
                                                                      GeneralClass.objCurrAirport.Latitude, 0, 0, 0,
                                                                      DateTime.Now.Date, 0);
                        //Tính lại tọa độ tâm center để vẽ object
                        float centerX, centerY;
                        centerX = centerY = 0;
                        mapControl.ucMap1.Map.ConvertCoord(ref centerX, ref centerY, ref objAirport.objGPSData.LonGPS,
                                                           ref objAirport.objGPSData.LatGPS,
                                                           MapXLib.ConversionConstants.miMapToScreen);
                        objAirport.CenterPoint = new PointF(centerX, centerY);
                        objAirport.Draw(g, GeneralClass.objCurrAirport.Airport_Name);

                        //Sau khi focus đến sân bay xong thì reset lại
                        GeneralClass.IsViewAirport = false;
                    }

                    //Nếu hiển thị sân bay
                    if (sânBayToolStripMenuItem.Image != null)
                    {
                        foreach (Airport obj in AirportList)
                        {
                            BaseGPSPoint objAirport = new GPSAirportPoint(obj.Airport_Name, obj.Longitude, obj.Latitude,
                                                                          0, 0, 0, DateTime.Now.Date, 0);
                            //Tính lại tọa độ tâm center để vẽ object
                            float centerX, centerY;
                            centerX = centerY = 0;
                            mapControl.ucMap1.Map.ConvertCoord(ref centerX, ref centerY,
                                                               ref objAirport.objGPSData.LonGPS,
                                                               ref objAirport.objGPSData.LatGPS,
                                                               ConversionConstants.miMapToScreen);
                            objAirport.CenterPoint = new PointF(centerX, centerY);
                            objAirport.Draw(g, obj.Airport_Name);
                        }
                    }

                    //==================================================
                    //9x9 coordinate
                    float x1, y1, x2, y2;
                    x1 = y1 = x2 = y2 = 0;
                    //Convert to Screen Coord
                    mapControl.ucMap1.Map.ConvertCoord(ref x1, ref y1, ref _coord9x9.NWLon, ref _coord9x9.NWLat,
                                                       MapXLib.ConversionConstants.miMapToScreen);
                    mapControl.ucMap1.Map.ConvertCoord(ref x2, ref y2, ref _coord9x9.SELon, ref _coord9x9.SELat,
                                                       MapXLib.ConversionConstants.miMapToScreen);
                    _coord9x9.Init(x1, y1, x2, y2, mapControl.ucMap1.Altitude);
                    if (ShowCoordinate9x9)
                    {
                        _coord9x9.Draw(g);
                    }

                    string myOPhu55File = "OPhu55.txt";
                    if (ShowCoordinate5x5)
                    {
                        _coord5x5 = new Coordinate5x5(106.706772, 10.768299);
                        this._coord5x5.PopulateOPhu(myOPhu55File);
                        this._coord5x5.Populate();
                        _coord5x5.draw(mapControl.ucMap1.Map, g);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("{0} - {1}", ex.Message, ex.StackTrace));
            }
            finally
            {
                g.Dispose();    
            }
        }

        public void AxMap_MouseDownEvent(object sender, AxMapXLib.CMapXEvents_MouseDownEvent e)
        {
            //if (e.button == 1)
            //{
            //    PointF pScreen = new PointF(e.x, e.y);
            //    //Nếu hiển thị thông tin tọa độ
            //    if (isShowGPSInfo)
            //    {
            //        foreach (BaseGPSPoint objGPS in _objGPSPointList)
            //        {
            //            //Nếu click trúng vào vị trí GPS thì hiển thị form
            //            if (objGPS.HitTest(pScreen) == 0 &&
            //                mapControl.ucMap1.Map.CurrentTool == MapXLib.ToolConstants.miArrowTool)
            //            {
            //                ShowGPSInfo(true);
            //                frmInfo.ShowInfo(objGPS);
            //                break;
            //            }
            //        }
                    
            //        //for (int i = 0; i < _objGPSPointList.Count; i++)
            //        //{
            //        //    BaseGPSPoint objGPS = _objGPSPointList[i];
            //        //    //Nếu click trúng vào vị trí GPS thì hiển thị form
            //        //    if (objGPS.HitTest(pScreen) == 0 &&
            //        //        mapControl.ucMap1.Map.CurrentTool == MapXLib.ToolConstants.miArrowTool)
            //        //    {
            //        //        ShowGPSInfo(true);
            //        //        frmInfo.ShowInfo(objGPS);
            //        //        break;
            //        //    }
            //        //}
            //    }
            //}
        }

        private BaseGPSPoint _objRecentGPSPoint;
        public void AxMap_MouseMoveEvent(object sender, AxMapXLib.CMapXEvents_MouseMoveEvent e)
        {
            Graphics g = mapControl.ucMap1.Map.CreateGraphics();
            UpdateStatusStrip(e.x, e.y);
            PointF pScreen = new PointF(e.x, e.y);
            //Nếu hiển thị thông tin tọa độ
            if (isShowGPSInfo)
            {
                foreach (BaseGPSPoint objGPS in _objGPSPointList)
                {
                    //Nếu click trúng vào vị trí GPS thì hiển thị form
                    if (objGPS.HitTest(pScreen) == 0 &&
                        mapControl.ucMap1.Map.CurrentTool == MapXLib.ToolConstants.miArrowTool)
                    {
                        if (frmInfo.Text == "")
                        {
                            frmInfo.Close();
                            frmInfo = new frmGPSInfo(this);
                        }

                        //Tô màu thể hiện điểm đang focus
                        Color focusColor = Color.Blue;
                        foreach (Color c in colorCurrNodeArr)
                        {
                            //Lấy màu khác với màu đang vẽ node
                            if (c != colorGPSPointNodeArr[objGPS.objGPSData.Name])
                            {
                                focusColor = c;
                                break;
                            }
                        }

                        //Reset màu của điểm xem gần nhất về màu mặc định
                        if (_objRecentGPSPoint != null)
                            _objRecentGPSPoint.Draw(g, colorGPSPointNodeArr[_objRecentGPSPoint.objGPSData.Name]);

                        //Tô màu thể hiện điểm focus
                        objGPS.Draw(g, focusColor);

                        //Lưu thành điểm xem gần nhất
                        _objRecentGPSPoint = objGPS;

                        //Hiện vị trí bảng chếch xuống bên dưới góc trái so với vị trí mouse
                        frmInfo.StartPosition = FormStartPosition.Manual;
                        Point p = mapControl.ucMap1.Map.PointToScreen(new Point((int)e.x, (int)e.y));
                        frmInfo.Location = new Point(p.X + 20, p.Y + 20); //new Point(this.ClientSize.Width - frmInfo.Width - 10, this.ClientSize.Height - frmInfo.Height - 10);
                        frmInfo.Show();
                        frmInfo.ShowInfo(objGPS);
                        
                        break;
                    }
                }
            }
        }

        public frmAirport _frmAirport;
        //=========================================
        /// <summary>
        /// 2014-11-06
        /// Biến dùng để lưu tọa độ được chọn trên bản đồ
        /// </summary>
        public bool _isSelectCoord = false;
        public void LoadAirportForm(frmAirport frm)
        {
            _isSelectCoord = true;
            _frmAirport = frm;
        }

        public void AxMap_MouseUpEvent(object sender, AxMapXLib.CMapXEvents_MouseUpEvent e)
        {
            UpdateStatusStrip(e.x, e.y);
            if (_isSelectCoord)
            {
                //Hiển thị tọa độ Longitude, Latitude
                double lon, lat;
                float x, y;
                x = e.x;
                y = e.y;
                lon = lat = 0;
                mapControl.ucMap1.Map.ConvertCoord(ref x, ref y, ref lon, ref lat, MapXLib.ConversionConstants.miScreenToMap);
                _frmAirport.GetSelectedCoord(lon, lat);
            }
                
                
        }

        private void AxMap_MouseWheelEvent(object sender, AxMapXLib.CMapXEvents_MouseWheelEvent e)
        {
            UpdateStatusStrip(e.x, e.y);

        }

        private void AxMap_MapViewChangedEvent(object sender, EventArgs e)
        {
            //toolStripStatusLabelAltitude.Text = string.Format("Độ cao: {0} km", mapControl.ucMap1.Altitude.ToString("#,##0.##0"));
            toolStripStatusLabelAltitude.Text = string.Format("Độ cao: {0} km",
                                                              mapControl.ucMap1.Altitude.ToString("#,#"));
            ShowTinhThanhLayers();
        }

        private void AxMap_DblClick(object sender, EventArgs e)
        {

        }
        #endregion

        ///// <summary>
        ///// Hàm khởi tạo load database lần đầu
        ///// </summary>
        //public void InitLoadDatabase()
        //{
        //    if (GeneralClass.objCurrPlane != null)
        //        GeneralClass.dbTestGPS = GPSDataRepository.LoadDatabase(GeneralClass.objCurrPlane.Code, 0, 0);
        //    else
        //        GeneralClass.dbTestGPS = GPSDataRepository.LoadDatabase(0, 0);
        //    //Lấy tọa độ mới nhất của các đường bay
        //    GeneralClass.GetCurrGPSDataArr();
                
        //    //Refresh bản đồ để vẽ tọa độ lên bản đồ
        //    mapControl.Refresh();
        //}

        #region StatusStrip

        public void UpdateStatusStrip(float x, float y)
        {
            PointF pScreenF = new PointF(x, y);
            //Hiển thị tọa độ Longitude, Latitude
            double lon, lat;
            lon = lat = 0;
            mapControl.ucMap1.Map.ConvertCoord(ref x, ref y, ref lon, ref lat, MapXLib.ConversionConstants.miScreenToMap);
            //toolStripStatusLabelCoordinate.Text = string.Format("K:{0} | V:{1}", GeneralClass.DecimalToDMS(lon), GeneralClass.DecimalToDMS(lat));
            //toolStripStatusLabelCoordinate2.Text = string.Format("(K:{0} | V:{1})", lon.ToString("#.####0"), lat.ToString("#.####0"));
            toolStripStatusLabelCoordinate.Text = string.Format("K:{0} | V:{1}", HTCollectionHelper.DecimalToDMS(lon),
                                                                HTCollectionHelper.DecimalToDMS(lat));
            toolStripStatusLabelCoordinate2.Text = string.Format("(K:{0} | V:{1})", lon.ToString("#.####0"),
                                                                 lat.ToString("#.####0"));
            toolStripStatusLabelAltitude.Text = string.Format("Độ cao: {0} km",
                                                              mapControl.ucMap1.Altitude.ToString("#,#"));
            toolStripStatusLabelCoord9x9.Text = string.Format("Tọa độ 9x9: {0}", _coord9x9.GetCoordinate(pScreenF));
            toolStripStatusLabelCoord5x5.Text = string.Format("Tọa độ 5x5: {0}", _coord5x5.getToaDo(mapControl.ucMap1.Map ,lon, lat));

            double angle, distance;
            angle = distance = 0;
            CalPVCL(lon, lat, ref angle, ref distance);
            if (distance > 100)
                toolStripStatusLabelPVCL.Text = string.Format("PVị-CLy: {0} độ - {1} km ", angle.ToString("#"), distance.ToString("#"));
            else
                toolStripStatusLabelPVCL.Text = string.Format("PVị-CLy: {0} độ - {1} km ", angle.ToString("#"), distance.ToString("0.#"));
        }

        /// <summary>
        /// Hiển thị lớp tỉnh, huyện, xã theo độ cao cho phép
        /// </summary>
        public void ShowTinhThanhLayers()
        {
            //=========================================================
            //Nếu độ cao nằm trong phạm vi hiện tỉnh, huyện, xã
            if (isShowTinh)
            {
                if ((int)mapControl.ucMap1.Altitude <= int.Parse(Properties.Settings.Default.Tinh))
                    ViewTinhThanhLayer("TINH", isShowTinh);
                else
                    ViewTinhThanhLayer("TINH", false);
            }

            if (isShowHuyen)
            {
                if ((int)mapControl.ucMap1.Altitude <= int.Parse(Properties.Settings.Default.Huyen))
                    ViewTinhThanhLayer("Huyen", isShowHuyen);
                else
                    ViewTinhThanhLayer("Huyen", false);
            }

            if (isShowXa)
            {
                if ((int)mapControl.ucMap1.Altitude <= int.Parse(Properties.Settings.Default.Xa))
                    ViewTinhThanhLayer("Xa", isShowXa);
                else
                    ViewTinhThanhLayer("Xa", false);
            }
            
            //=========================================================
        }
        #endregion

        #region "ToolStripMenu"

        private bool ShowCoordinate9x9 = false;
        private void tọaĐộ9x9ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                ShowCoordinate9x9 = !ShowCoordinate9x9;
                if (ShowCoordinate9x9)
                {
                    //string value = Properties.Settings.Default.Coord9x9;
                    //_coord9x9.BigSquareArray = value.Split(new char[] { '|' });
                    tọaĐộ9x9ToolStripMenuItem.Image = Properties.Resources.tick_16;
                    mapControl.Refresh();

                    //float x1, y1, x2, y2;
                    //x1 = y1 = x2 = y2 = 0;
                    ////Convert to Screen Coord
                    //mapControl.ucMap1.Map.ConvertCoord(ref x1, ref y1, ref _coord9x9.NWLon, ref _coord9x9.NWLat, MapXLib.ConversionConstants.miMapToScreen);
                    //mapControl.ucMap1.Map.ConvertCoord(ref x2, ref y2, ref _coord9x9.SELon, ref _coord9x9.SELat, MapXLib.ConversionConstants.miMapToScreen);
                    //_coord9x9.Draw(mapControl.ucMap1.Map.CreateGraphics(), x1, y1, x2, y2, mapControl.ucMap1.Altitude);
                }
                else
                {
                    tọaĐộ9x9ToolStripMenuItem.Image = null;
                    mapControl.Refresh();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("{0} - {1}", ex.Message, ex.StackTrace));
            }

        }

        private void địaDanhToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                string layername = "TENTPHO";
                mapControl.ucMap1.Map.Layers[layername].Visible = !mapControl.ucMap1.Map.Layers[layername].Visible;
                //_objMapControl.Map.Layers["TENTPHO"].LabelProperties.Style.TextFont = ".VnArial";
                mapControl.ucMap1.Map.Layers[layername].AutoLabel = mapControl.ucMap1.Map.Layers[layername].Visible;
                if (mapControl.ucMap1.Map.Layers[layername].Visible)
                    địaDanhToolStripMenuItem.Image = Properties.Resources.tick_16;
                else
                    địaDanhToolStripMenuItem.Image = null;
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("{0} - {1}", ex.Message, ex.StackTrace));
            }
        }

        private void biểnĐảoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                string layername = "BIENDAO";
                mapControl.ucMap1.Map.Layers[layername].OverrideStyle = true;
                mapControl.ucMap1.Map.Layers[layername].Visible = !mapControl.ucMap1.Map.Layers[layername].Visible;
                //_objMapControl.Map.Layers["TENTPHO"].LabelProperties.Style.TextFont = ".VnArial";
                mapControl.ucMap1.Map.Layers[layername].AutoLabel = mapControl.ucMap1.Map.Layers[layername].Visible;
                if (mapControl.ucMap1.Map.Layers[layername].Visible)
                    biểnĐảoToolStripMenuItem.Image = Properties.Resources.tick_16;
                else
                    biểnĐảoToolStripMenuItem.Image = null;
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("{0} - {1}", ex.Message, ex.StackTrace));
            }
        }

        #region "Airport layer Samples"
        public void addMapXSanBay(string _layername, string _keyValue, MapXLib.Point point)
        {
            MapXLib.Feature circF = new Feature();
            MapXLib.StyleClass newstylec = new StyleClass();
            newstylec.LineColor = 255 +  256 * 1 + 256 * 256 * 0;           //r + 256*g + 256*256*b
            //newstylec.LineStyle = (PenStyleConstants)11;
            newstylec.LineWidth = 4;
            newstylec.RegionPattern = MapXLib.FillPatternConstants.miPatternNoFill;// (miPatternNoFill);
            //newstylec.RegionTransparent = true;
            newstylec.SymbolType = MapXLib.SymbolTypeConstants.miSymbolTypeTrueTypeFont;
            //newstylec.TextFont.Name = ".VnArial";
            stdole.IFontDisp _font = (stdole.IFontDisp)newstylec.SymbolFont;
            _font.Name = ".VnArial";
            newstylec.SymbolCharacter = 51;
            _font.Size = 20;
            //newstylec.SymbolFontRotation = 360;
            newstylec.SymbolFontHalo = false;
            //newstylec.SymbolFontColor = (uint)MapXLib.ColorConstants.miColorYellow;
            //newstylec.SymbolFontBackColor = (uint)MapXLib.ColorConstants.miColorLimeGreen;

            circF = this.mapControl.ucMap1.Map.FeatureFactory.CreateCircularRegion(MapXLib.CircleTypeConstants.miCircleTypeMap, point, 2000, MapXLib.MapUnitConstants.miUnitMeter, 200, newstylec);
            circF.KeyValue = _keyValue;
            this.mapControl.ucMap1.Map.Layers._Item(_layername).AddFeature(circF, new MapXLib.RowValuesClass());
        }

        /// <summary>
        /// Thêm layer mới
        /// </summary>
        /// <param name="_layerName"></param>
        /// <param name="_layerType"></param>
        public void miAddSanBayLayer(string _layerName, LAYERTYPE _layerType)
        {
            AxMapXLib.AxMap axMap1 = mapControl.ucMap1.Map;
            MapXLib.Layer lyr;
            MapXLib.LayerInfoClass lyrInfo = new MapXLib.LayerInfoClass();
            MapXLib.FieldsClass flds = new MapXLib.FieldsClass();

            flds.AddStringField("name", 50, 10);
            flds.AddStringField("lon", 50, 10);
            flds.AddStringField("lat", 50, 10);
            lyrInfo.Type = MapXLib.LayerInfoTypeConstants.miLayerInfoTypeTemp;
            lyrInfo.AddParameter("name", _layerName);
            lyrInfo.AddParameter("Fields", flds);

            lyr = axMap1.Layers.Add(lyrInfo, 1);
            lyr.Editable = true;
            axMap1.Layers.InsertionLayer = lyr;

            switch (_layerType)
            {
                case LAYERTYPE.POLYLINE:
                    break;
                case LAYERTYPE.POINT:
                    axMap1.Layers.AnimationLayer = lyr;
                    break;
            }

            this.mapControl.ucMap1.miSetStyleLabel(_layerName);
        }

        #endregion

        private void sânBayToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                if (sânBayToolStripMenuItem.Image == null)
                    sânBayToolStripMenuItem.Image = Properties.Resources.tick_16;
                else
                    sânBayToolStripMenuItem.Image = null;
                mapControl.Refresh();

                //string layername = "SANBAY";
                //mapControl.ucMap1.Map.Layers[layername].Visible = !mapControl.ucMap1.Map.Layers[layername].Visible;
                //if (mapControl.ucMap1.Map.Layers[layername].Visible)
                //    sânBayToolStripMenuItem.Image = Properties.Resources.tick_16;
                //else
                //    sânBayToolStripMenuItem.Image = null;

                ////string layername = "SANBAY";
                ////mapControl.ucMap1.Map.Layers[layername].Visible = !mapControl.ucMap1.Map.Layers[layername].Visible;
                //string _layerName = "airport";
                //try
                //{
                //    //mapControl.ucMap1.Map.Layers.Remove(_layerName);
                //    miAddSanBayLayer(_layerName, LAYERTYPE.POLYON);
                //}
                //catch (Exception)
                //{
                //    ;
                //}

                //if (mapControl.ucMap1.Map.Layers[_layerName].Visible)
                //{
                //    sânBayToolStripMenuItem.Image = Properties.Resources.tick_16;

                //    DataTable db = _airPortRespository.GetAll();
                //    foreach (DataRow dr in db.Rows)
                //    {
                //        string name = dr["airport_name"].ToString();
                //        double lon = Convert.ToDouble(dr["longitude"]);
                //        double lat = Convert.ToDouble(dr["latitude"]);

                //        MapXLib.Point point = new MapXLib.PointClass();
                //        //point.CreateDispatch(point.GetClsid());
                //        point.Set(lon, lat);

                //        //Vẽ sân bay
                //        //this.mapControl.ucMap1.miAddStylePoint("airport", lon, lat, name, STYLESINGLETYPE.NORMALPOINT_RED);
                //        addMapXSanBay(_layerName, name, point);

                //    }
                //    //this.mapControl.ucMap1.Map.Layers._Item(_layerName).AutoLabel = true;
                //    //this.mapControl.ucMap1.Map.Layers._Item(_layerName).OverrideStyle = true;
                //}
                //else
                //    sânBayToolStripMenuItem.Image = null;
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("{0} - {1}", ex.Message, ex.StackTrace));
            }
        }


        private void cấuHìnhCổngCOMToolStripMenuItem_Click(object sender, EventArgs e)
        {
            frmCOMSetting frm = new frmCOMSetting();
            frm.ShowDialog();
        }

        private void cấuHìnhTọaĐộ9x9ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                frmConfig9x9 frm = new frmConfig9x9();
                frm.ShowDialog();
                string value = Properties.Settings.Default.Coord9x9;
                _coord9x9.BigSquareArray = value.Split(new char[] {'|'});
                mapControl.ucMap1.Refresh();
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("{0} - {1}", ex.Message, ex.StackTrace));
            }
        }

        
        
        private void ViewTinhThanhLayer(string layerName, bool isVisible)
        {
            mapControl.ucMap1.Map.Layers[layerName].OverrideStyle = true;
            mapControl.ucMap1.Map.Layers[layerName].Visible = isVisible;
            mapControl.ucMap1.Map.Layers[layerName].AutoLabel = mapControl.ucMap1.Map.Layers[layerName].Visible;
        }

        private void tỉnhThànhToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                string layerName = "TINH";
                isShowTinh = !isShowTinh;

                if ((int)mapControl.ucMap1.Altitude <= int.Parse(Properties.Settings.Default.Tinh))
                {
                    ViewTinhThanhLayer(layerName, isShowTinh);
                }
                else
                {
                    string msg = string.Format("Lớp bản đồ Tỉnh chỉ hiện khi độ cao hiển thị <= {0} km",
                                               Properties.Settings.Default.Tinh);
                    MessageBox.Show(msg);
                }
                if (isShowTinh)
                    tỉnhThànhToolStripMenuItem.Image = Properties.Resources.tick_16;
                else
                    tỉnhThànhToolStripMenuItem.Image = null;
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("{0} - {1}", ex.Message, ex.StackTrace));
            }
        }

        private void huyệnToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                string layerName = "Huyen";
                isShowHuyen = !isShowHuyen;
                if ((int)mapControl.ucMap1.Altitude <= int.Parse(Properties.Settings.Default.Huyen))
                {
                    ViewTinhThanhLayer(layerName, isShowHuyen);
                }
                else
                {
                    string msg = string.Format("Lớp bản đồ Huyện chỉ hiện khi độ cao hiển thị <= {0} km",
                                              Properties.Settings.Default.Huyen);
                    MessageBox.Show(msg);
                }
                if (isShowHuyen)
                    huyệnToolStripMenuItem.Image = Properties.Resources.tick_16;
                else
                    huyệnToolStripMenuItem.Image = null;

            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("{0} - {1}", ex.Message, ex.StackTrace));
            }
        }

        private void xãToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                string layerName = "Xa";
                isShowXa = !isShowXa;
                if ((int)mapControl.ucMap1.Altitude <= int.Parse(Properties.Settings.Default.Xa))
                {
                    ViewTinhThanhLayer(layerName, isShowXa);
                }
                else
                {
                    string msg = string.Format("Lớp bản đồ Xã chỉ hiện khi độ cao hiển thị <= {0} km",
                                              Properties.Settings.Default.Xa);
                    MessageBox.Show(msg);
                }
                if (isShowXa)
                    xãToolStripMenuItem.Image = Properties.Resources.tick_16;
                else
                    xãToolStripMenuItem.Image = null;

            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("{0} - {1}", ex.Message, ex.StackTrace));
            }
        }

        private void bảnĐồ1ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                string layerName = "VietNam";
                mapControl.ucMap1.Map.Layers[layerName].Visible = !mapControl.ucMap1.Map.Layers[layerName].Visible;
                if (mapControl.ucMap1.Map.Layers[layerName].Visible)
                    bảnĐồ1ToolStripMenuItem.Image = Properties.Resources.tick_16;
                else
                    bảnĐồ1ToolStripMenuItem.Image = null;
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("{0} - {1}", ex.Message, ex.StackTrace));
            }
        }

        private void bảnĐồ2ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                string layerName = "AsiaMap";
                mapControl.ucMap1.Map.Layers[layerName].Visible = !mapControl.ucMap1.Map.Layers[layerName].Visible;
                if (mapControl.ucMap1.Map.Layers[layerName].Visible)
                    bảnĐồ2ToolStripMenuItem.Image = Properties.Resources.tick_16;
                else
                    bảnĐồ2ToolStripMenuItem.Image = null;
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("{0} - {1}", ex.Message, ex.StackTrace));
            }
        }

        //Biến cho biết show/hide bảng xem lại dữ liệu
        private bool isShowReviewData = false;
        //Biến cho biết show/hide bảng tracking tọa độ gps 
        private bool isShowTrackingData = false;
        private void bảngTheoDõiToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                isShowTrackingData = !isShowTrackingData;

                if (isShowTrackingData)
                {
                    //Nếu đang chạy review data thì stop trước
                    if (GeneralClass.IsReplay == 1)
                        reviewGpsDataControl.btnReplay_Click(null, null);

                    //Kết nối DB
                    GeneralClass.gpsDBFile = Path.GetDirectoryName(Application.ExecutablePath) + "\\gpsdata.sdf";
                    string msg = GeneralClass.ConnectDatabase(GeneralClass.gpsDBFile);
                    
                    //Lưu database trước khi chạy dữ liệu mới
                    GeneralClass.BackupDB(GeneralClass.gpsDBFile);
                    
                    //Xóa hết dữ liệu gps data trong file gpsdata.sdf
                    GPSDataRepository.DeleteAll();

                    if (msg != "")
                    {
                        MessageBox.Show(msg);
                        return;
                    }

                    panelFunction.Show();
                    panelFunction.Controls.Clear();
                    panelFunction.Width = 503;

                    isShowReviewData = false;
                    xemLạiDữLiệuToolStripMenuItem.Image = null;

                    splitter1.Visible = true;

                    bảngTheoDõiToolStripMenuItem.Image = Properties.Resources.tick_16;

                    gpsDataControl = new ucGPSData(mapControl, GeneralClass.objPort);
                    gpsDataControl.OpenCOMPort_ClickEvent += new EventHandler(btnOpenCOMPort_Click);
                    gpsDataControl.Dock = DockStyle.Fill;
                    panelFunction.Controls.Add(gpsDataControl);
                }
                else
                {
                    bảngTheoDõiToolStripMenuItem.Image = null;
                    panelFunction.Hide();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("{0} - {1}", ex.Message, ex.StackTrace));
            }
        }

        private void btnOpenCOMPort_Click(object sender, EventArgs e)
        {
            try
            {
                if (GeneralClass.objPort.IsOpen())
                {
                    UpdateToolStrip(string.Format("Cổng {0} đã được mở...", GeneralClass.objPort.PortName));
                }
                else
                {
                    UpdateToolStrip("Cổng COM chưa mở...");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("{0} - {1}", ex.Message, ex.StackTrace));
            }
            
        }

        private void xemLạiDữLiệuToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                if (GeneralClass.objPort.IsOpen())
                {
                    MessageBox.Show("Cổng COM đang mở. Chỉ chọn xem lại file CSDL khác khi đã đóng cổng COM.");
                    return;
                }

                //Show/Hide tracking data
                isShowReviewData = !isShowReviewData;

                if (isShowReviewData)
                {
                    //=========================================
                    //Cho hiển thị quỹ đạo bay khi review lại dữ liệu
                    isShowRoute = false;
                    hiểnThịQuỹĐạoBayToolStripMenuItem.PerformClick();

                    panelFunction.Show();
                    panelFunction.Controls.Clear();
                    panelFunction.Width = 503;

                    //if show review data then hide tracking
                    isShowTrackingData = false;
                    bảngTheoDõiToolStripMenuItem.Image = null;

                    splitter1.Visible = true;

                    xemLạiDữLiệuToolStripMenuItem.Image = Properties.Resources.tick_16;

                    reviewGpsDataControl = new ucReviewGPSData(this, GeneralClass.objPort);
                    reviewGpsDataControl.Dock = DockStyle.Fill;
                    panelFunction.Controls.Add(reviewGpsDataControl);
                }
                else
                {
                    xemLạiDữLiệuToolStripMenuItem.Image = null;
                    panelFunction.Hide();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("{0} - {1}", ex.Message, ex.StackTrace));
            }
        }

        
        private void hiểnThịQuỹĐạoBayToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                isShowRoute = !isShowRoute;
                if (isShowRoute)
                {
                    hiểnThịQuỹĐạoBayToolStripMenuItem.Image = Properties.Resources.tick_16;
                }
                else
                {
                    hiểnThịQuỹĐạoBayToolStripMenuItem.Image = null;
                }

                mapControl.Refresh();
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("{0} - {1}", ex.Message, ex.StackTrace));
            }


           
        }

        private void hiểnThịTọaĐộBayToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                isShowGPSData = !isShowGPSData;
                if (isShowGPSData)
                    hiểnThịTọaĐộBayToolStripMenuItem.Image = Properties.Resources.tick_16;
                else
                    hiểnThịTọaĐộBayToolStripMenuItem.Image = null;
                mapControl.Refresh();
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("{0} - {1}", ex.Message, ex.StackTrace));
            }
           
        }

        private bool isShowGPSInfo = true;
        public void ShowGPSInfo(bool value)
        {
            try
            {
                isShowGPSInfo = value;
                if (isShowGPSInfo)
                {
                    hiểnThịThôngTinQuỹĐạoToolStripMenuItem.Image = Properties.Resources.tick_16;


                    //hiểnThịTọaĐộBayToolStripMenuItem.Text = "Ẩn tọa độ bay";
                }
                else
                {
                    hiểnThịThôngTinQuỹĐạoToolStripMenuItem.Image = null;
                    //Point p = frmInfo.Location;
                    try
                    {
                        frmInfo.Hide();
                    }
                    catch
                    {
                        frmInfo = null;
                    }

                    //hiểnThịTọaĐộBayToolStripMenuItem.Text = "Hiển thị tọa độ bay";
                }
                //mapControl.Refresh();
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("{0} - {1}", ex.Message, ex.StackTrace));
            }
        }

        private void hiểnThịThôngTinQuỹĐạoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                isShowGPSInfo = !isShowGPSInfo;
                ShowGPSInfo(isShowGPSInfo);
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("{0} - {1}", ex.Message, ex.StackTrace));
            }
        }

        #endregion

        private bool isOptimize = false;
        private void hiểnThịTốiƯuTốcĐộToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Chức năng này chưa cập nhật");
            return;
            isOptimize = !isOptimize;
            //isOptimize = false;
            if (isOptimize)
            {
                hiểnThịTốiƯuTốcĐộToolStripMenuItem.Image = Properties.Resources.tick_16;
                //hiểnThịTọaĐộBayToolStripMenuItem.Text = "Ẩn tọa độ bay";
            }
            else
            {
                hiểnThịTốiƯuTốcĐộToolStripMenuItem.Image = null;
                //hiểnThịTọaĐộBayToolStripMenuItem.Text = "Hiển thị tọa độ bay";
            }
            mapControl.Refresh();
        }

        private void quảnLýSânBayToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                frmAirportList frm = new frmAirportList(this);
                frm.Show();


                
                
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("{0} - {1}", ex.Message, ex.StackTrace));
            }
        }

        private void testingToolStripMenuItem_Click(object sender, EventArgs e)
        {
            frmGPSTracking_Testing frm = new frmGPSTracking_Testing();
            this.Hide();
            frm.ShowDialog();
            this.Show();
        }

        private void quảnLýĐườngBayToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                if (quảnLýĐườngBayToolStripMenuItem.Image == null)
                {
                    quảnLýĐườngBayToolStripMenuItem.Image = Properties.Resources.tick_16;
                    _ucToolStripControl.ToolStripControl.Items["toolStripButtonRouteTool"].Enabled = true;
                    this.mapControl.ucMap1.ActiveToolStrip = enumToolStripType.VectorShapeToolStrip;
                    this.mapControl.Option = enumOption.SELECT;
                    this.mapControl.Status = enumStatus.SELRECT;
                    this.mapControl.redimStatus = enumRedimStatus.NO;
                }
                else
                {
                    quảnLýĐườngBayToolStripMenuItem.Image = null;
                    _ucToolStripControl.ToolStripControl.Items["toolStripButtonRouteTool"].Enabled = false;
                    this.mapControl.ucMap1.ActiveToolStrip = enumToolStripType.ActionToolStrip;
                    this.mapControl.Option = enumOption.NONE;
                    this.mapControl.Status = enumStatus.NONE;
                    this.mapControl.redimStatus = enumRedimStatus.NO;
                    mapControl.ObjShapes.deSelect();
                    this.mapControl.ucMap1.Map.Refresh();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("{0} - {1}", ex.Message, ex.StackTrace));
            }

        }

        //Cho biết có hiển thị đường bay hay không
        private void hiểnThịĐườngBayToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                mapControl.isShowDrawingRoute = !mapControl.isShowDrawingRoute;
                if (mapControl.isShowDrawingRoute)
                {
                    mapControl.VectShapeLoader();
                    mapControl.ObjShapes.deSelect();
                    hiểnThịĐườngBayToolStripMenuItem.Image = Properties.Resources.tick_16;
                }
                else
                {
                    mapControl.VectShapeSaver();
                    hiểnThịĐườngBayToolStripMenuItem.Image = null;
                }

                mapControl.Refresh();
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("{0} - {1}", ex.Message, ex.StackTrace));
            }
        }

        private void frmGPSTracking_FormClosing(object sender, FormClosingEventArgs e)
        {
            try
            {
                mapControl.VectShapeSaver();
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("{0} - {1}", ex.Message, ex.StackTrace));
            }
        }

        private void cấuHìnhHệThốngToolStripMenuItem_Click(object sender, EventArgs e)
        {
            frmSetting frm = new frmSetting();
            frm.ShowDialog();
            string value = Properties.Settings.Default.Coord9x9;
            _coord9x9.BigSquareArray = value.Split(new char[] { '|' });
            mapControl.ucMap1.Refresh();
        }

        

        private void quảnLýMáyBayToolStripMenuItem_Click(object sender, EventArgs e)
        {
            frmPlaneList frm = new frmPlaneList(this);
            frm.Show();
        }

        /// <summary>
        /// Hàm tính phương vị, cự ly so với sân bay đang chọn
        /// </summary>
        /// <param name="lon"></param>
        /// <param name="lat"></param>
        /// <param name="angle"></param>
        /// <param name="distance"></param>
        public void CalPVCL(double lon, double lat, ref double angle, ref double distance)
        {
            //Tinh phương vị cự ly
            //Tính cạnh huyền (cạnh nối tâm sân bay với điểm gpsPoint)
            double canhHuyen = MapHelper.CalculateDistance(mapControl.ucMap1.Map,
                                        lon,
                                        lat,
                                        GeneralClass.objCurrAirport.Longitude,
                                        GeneralClass.objCurrAirport.Latitude);
            if (canhHuyen > 2000)
            {
                angle = 360;
                distance = 2000;
                return;
            }

            //Tính cạnh đối là cạnh góc vuông (cạnh nối điểm gpsPoint với điểm tạo bởi tọa độ lon của sân bay với tọa độ lat của điểm gpsPoint)
            double canhGocVuong = MapHelper.CalculateDistance(mapControl.ucMap1.Map,
                                        lon,
                                        lat,
                                        GeneralClass.objCurrAirport.Longitude,
                                        lat);

            //sin = đối/huyền
            angle = Math.Asin(canhGocVuong / canhHuyen) * 180 / Math.PI;

            if (lon > GeneralClass.objCurrAirport.Longitude)
            {
                if (lat > GeneralClass.objCurrAirport.Latitude)
                {
                    angle += 0;
                }
                else
                {
                    angle = 180 - angle;
                }
            }
            else
            {
                if (lat < GeneralClass.objCurrAirport.Latitude)
                {
                    angle += 180;
                }
                else
                {
                    angle = 360 - angle;
                }
            }

            distance = canhHuyen;

        }

        /// <summary>
        /// 2014-11-06
        /// Cập nhật lại list plane nếu có thay đổi
        /// </summary>
        /// <param name="isChanged"></param>
        public void RefreshPlaneList(bool isChanged)
        {
            if (isChanged)
            {
                //Load lại danh sách plane sau khi đóng lại
                //Chú ý: GeneralClass.LoadPlaneList() phải đứng trên LoadCombobox_Planes();
                GeneralClass.LoadPlaneList();

                //Nếu dữ liệu thay đổi thì cập nhật lại
                if (bảngTheoDõiToolStripMenuItem.Image != null)
                    gpsDataControl.LoadCombobox_Planes();
                else if (xemLạiDữLiệuToolStripMenuItem.Image != null)
                    reviewGpsDataControl.LoadCombobox_Planes();


            }
        }

        /// <summary>
        /// 2014-11-06
        /// Cập nhật lại list plane nếu có thay đổi
        /// </summary>
        /// <param name="isChanged"></param>
        public void RefreshAirportList(bool isChanged)
        {
            if (isChanged)
            {
                AirportList = _airPortRespository.GetAllList();

                //Nếu dữ liệu thay đổi thì cập nhật lại
                if (bảngTheoDõiToolStripMenuItem.Image != null)
                    gpsDataControl.LoadAirport();
                else if (xemLạiDữLiệuToolStripMenuItem.Image != null)
                    reviewGpsDataControl.LoadAirport();

                //Cập nhật lại tọa độ sân bay
                if (sânBayToolStripMenuItem.Image != null)
                    mapControl.Refresh();
            }
        }

        private bool ShowCoordinate5x5 = false;
        private void tọaĐộ5x5ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                ShowCoordinate5x5 = !ShowCoordinate5x5;
                if (ShowCoordinate5x5)
                {
                    tọaĐộ5x5ToolStripMenuItem.Image = Properties.Resources.tick_16;
                    mapControl.Refresh();
                }
                else
                {
                    tọaĐộ5x5ToolStripMenuItem.Image = null;
                    mapControl.Refresh();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("{0} - {1}", ex.Message, ex.StackTrace));
            }
        }
    }
}